import time
from queue import Queue
from threading import Thread


class Producer(Thread):
    def __init__(self, name, queue):
        Thread.__init__(self, name=name)
        self.queue = queue

    def run(self):
        for i in range(1, 30):
            q.put(i)
            print(f'{self.name}生产了{i}')
            # time.sleep(1)
        print(f'{self.name}生产了所有的数据')


class Consumer(Thread):
    def __init__(self, name, queue):
        Thread.__init__(self, name=name)
        self.queue = queue

    def run(self):
        for _ in range(1, 30):
            print(f'{self.name}消费了{self.queue.get()}')
            # 表示前面排队的任务已经被完成。被队列的消费者线程使用。每个 get() 被用于获取一个任务， 后续调用 task_done() 告诉队列，该任务的处理已经完成。
            self.queue.task_done()
        print(f'{self.name}消费完了所有的数据')


if __name__ == '__main__':
    q = Queue(4)
    p = Producer('producer', q)
    c = Consumer('consumer', q)
    p.start()
    c.start()
    p.join()
    c.join()
    print('程序结束')
